#include "Scene.h"

void Scene_Tour_Suivant(t_liste* pRattaupe, t_motte** pMotte, SDL_Surface* ecran, int eNombreJoueur, t_liste** pmatRattaupe, int* classement, SOCKET* csock, SOCKET* csockfin){
	/* S'occupe du déplacement des rattaupes à chaque tour */
	int eRattaupesNb=1, ePosX, ePosY;
	char *sCommande=(char*)malloc(10*sizeof(char));
	char Deplacement[100], DeplacementPos[80], Procreation[70], Sante[15], Suivre[70], Grandir[70];
	SDL_Surface *SDL_Texte = NULL, *SDL_Clean = NULL;
	t_rattaupes Rattaupe, RattaupeMere;
	RattaupeMere.ePosX=0;

	en_tete(pRattaupe);

	while(!hors_liste(pRattaupe)){
		valeur_elt(pRattaupe,&Rattaupe);
		Rattaupe_Focus(ecran, Rattaupe);
		ePosX=Rattaupe.ePosX;
		ePosY=Rattaupe.ePosY;
		SDL_Rect_Blanc(ecran,SDL_Clean, 15, 310, 0, HAUTEUR_FENETRE+35); /* Déplacement */
		SDL_Rect_Blanc(ecran,SDL_Clean, 20, 85, LARGEUR_FENETRE-85, HAUTEUR_FENETRE); /* Santé*/
		SDL_Rect_Blanc(ecran,SDL_Clean, 15, 345, 5, HAUTEUR_FENETRE+55); /* Gestation */
    		SDL_Flip(ecran);
		
		if(Rattaupe.Age==Adulte){
			RattaupeMere=Rattaupe;
			if(bDeplacement_possible(pMotte,ePosX,ePosY)){
				if(Rattaupe.Sexe==Male){
					sprintf(Deplacement, "Entrez le déplacement de votre taupe mâle n°%i",eRattaupesNb);
					SDL_Ecrire(ecran, SDL_Texte, Deplacement, 5, HAUTEUR_FENETRE+35);
				}
				else {
					sprintf(Deplacement, "Entrez le déplacement de votre taupe femelle n°%i",eRattaupesNb);
					SDL_Ecrire(ecran, SDL_Texte, Deplacement, 5, HAUTEUR_FENETRE+35);
				}

				if(Rattaupe.Sexe==Femelle){
					sprintf(Procreation, "Temps avant de pouvoir procréer : %i tours",6-Rattaupe.eDelaiGrossesse);
					SDL_Ecrire(ecran, SDL_Texte, Procreation, 5, HAUTEUR_FENETRE+55);
				}

				sprintf(Sante, "Sante : %i%%",Rattaupe.eSante);
				SDL_Ecrire(ecran, SDL_Texte, Sante, LARGEUR_FENETRE-80, HAUTEUR_FENETRE+5);
				SDL_Flip(ecran);

				sDeplacEcrire(sCommande,ecran, Rattaupe, pMotte, eNombreJoueur, pmatRattaupe, classement, csock, csockfin);
				while(!bDeplacement_possible_dir(pMotte,ePosX,ePosY,sCommande)){
					sprintf(DeplacementPos, "Déplacement impossible");
					SDL_Ecrire(ecran, SDL_Texte, DeplacementPos, LARGEUR_FENETRE-150, HAUTEUR_FENETRE+55);
					SDL_Flip(ecran);

					sDeplacEcrire(sCommande,ecran, Rattaupe, pMotte, eNombreJoueur, pmatRattaupe, classement, csock, csockfin);

					SDL_Rect_Blanc(ecran,SDL_Clean, 20, 140, LARGEUR_FENETRE-150, HAUTEUR_FENETRE+55); /* Déplacement impossible */
					SDL_Flip(ecran);
				}
				Rattaupes_deplacement(pRattaupe, pMotte, ePosX, ePosY, sCommande, ecran);
			}
			else {
				sprintf(Deplacement, "Votre taupe ne peut pas bouger");
				SDL_Ecrire(ecran, SDL_Texte, Deplacement, LARGEUR_FENETRE-180, HAUTEUR_FENETRE+55);
				SDL_Flip(ecran);

				sleep(2);
				SDL_Rect_Blanc(ecran,SDL_Clean, 20, 180, LARGEUR_FENETRE-180, HAUTEUR_FENETRE+55); /* Taupe peut pas bouger */
				SDL_Flip(ecran);
				}
		}
		else {
			pMotte[ePosX][ePosY].eTaupes-=1;
			/* On vérifie ici si la mère n'est pas morte en vérifiant si elle est autour du Rattaupe et juste avant dans la liste */
			if(RattaupeMere.ePosX!=0&&RattaupeMere.eDelaiGrossesse<=3&&RattaupeMere.Age==Adulte&&RattaupeMere.Sexe==Femelle&&((RattaupeMere.ePosX==ePosX&&RattaupeMere.ePosY==ePosY)||((RattaupeMere.ePosX==ePosX+1||RattaupeMere.ePosX==ePosX-1||RattaupeMere.ePosX==ePosX)&&(RattaupeMere.ePosY==ePosY+1||RattaupeMere.ePosY==ePosY-1||RattaupeMere.ePosY==ePosY)))){
				sprintf(Suivre, "Votre jeune taupe (%i,%i) va suivre sa mère",ePosX,ePosY);
				SDL_Ecrire(ecran, SDL_Texte, Suivre, 5, HAUTEUR_FENETRE+35);
				
				pMotte[RattaupeMere.ePosX][RattaupeMere.ePosY].eTaupes+=1;
				Rattaupe.ePosX=RattaupeMere.ePosX;
				Rattaupe.ePosY=RattaupeMere.ePosY;
				modif_elt(pRattaupe,Rattaupe);

				sprintf(Grandir, "Encore %i tours avant que votre jeune taupe ne devienne adulte",4-Rattaupe.eGestation);
				SDL_Ecrire(ecran, SDL_Texte, Grandir, 5, HAUTEUR_FENETRE+55);
				SDL_Flip(ecran);
			}
			else {
				sprintf(Grandir, "La mère du petit est morte, il ne peut survivre seul !");
				SDL_Ecrire(ecran, SDL_Texte, Grandir, 5, HAUTEUR_FENETRE+35);
				SDL_Flip(ecran);
				oter_elt(pRattaupe);
			}
		sleep(2);
		}
		Vue_afficher(pMotte,ecran);
		SDL_Flip(ecran);
		eRattaupesNb++;
		suivant(pRattaupe);
	}

	free(sCommande);
	SDL_FreeSurface(SDL_Texte);
	SDL_FreeSurface(SDL_Clean);
}

void sDeplacEcrire (char *sCommande, SDL_Surface* ecran, t_rattaupes Rattaupe, t_motte** pMotte, int eNombreJoueur, t_liste** pmatRattaupe, int* classement, SOCKET* csock, SOCKET* csockfin){
	/* SDL event attendant que le joueur écrive une touche correspondante au switch pour le déplacement */
	SDL_Event event;
	int continuer = 1;
	int eNombreJoueurIncremente;
	int32_t eJeufin=1;
	eJeufin=htonl(eJeufin);

	while (continuer)
	{
		SDL_WaitEvent(&event);
		switch(event.type)
		{
			case SDL_QUIT:
				free(sCommande);
				for(eNombreJoueurIncremente=1;eNombreJoueurIncremente<eNombreJoueur;eNombreJoueurIncremente++){
					Envoyer_tour(0,eNombreJoueur,csock);
					send(csockfin[eNombreJoueurIncremente], (char const*)&eJeufin, sizeof(eJeufin), 0);
				}
				Quitter(eNombreJoueur,pMotte,pmatRattaupe,classement,csock,csockfin);
				exit(EXIT_SUCCESS);
				break;
			case SDL_KEYDOWN:
				switch(event.key.keysym.sym)
				{
					case SDLK_ESCAPE:
						Proposer_Quitter_enjeu(eNombreJoueur,pMotte,pmatRattaupe,classement,ecran,csock,csockfin);
						Vue_afficher(pMotte,ecran);
						Rattaupe_Focus(ecran, Rattaupe);
						SDL_Flip(ecran);
						break;
					case SDLK_UP:
						strcpy(sCommande, "haut");
						continuer=0;
						break;
					case SDLK_DOWN:
						strcpy(sCommande, "bas");
						continuer=0;
						break;
					case SDLK_RIGHT:
						strcpy(sCommande, "droite");
						continuer=0;
						break;
					case SDLK_LEFT:
						strcpy(sCommande, "gauche");
						continuer=0;
						break;
					case SDLK_SPACE:
						strcpy(sCommande, "vide");
						continuer=0;
						break;
					default:
						break;
				}
			   break;
		}
	}

}

int bDeplacement_possible(t_motte** pMotte, int ePosX, int ePosY){
	/* Regarde si le rattaupe peut se déplacer ou non */
	if(pMotte[ePosX+1][ePosY].eTaupes<2&&pMotte[ePosX+1][ePosY].eEtatterre!=Pierre) return 1;
	if(pMotte[ePosX][ePosY+1].eTaupes<2&&pMotte[ePosX][ePosY+1].eEtatterre!=Pierre) return 1;
	if(pMotte[ePosX-1][ePosY].eTaupes<2&&pMotte[ePosX-1][ePosY].eEtatterre!=Pierre) return 1;
	if(pMotte[ePosX][ePosY-1].eTaupes<2&&pMotte[ePosX][ePosY-1].eEtatterre!=Pierre)	return 1;

	return 0;
}

int bDeplacement_possible_dir(t_motte** pMotte, int ePosX, int ePosY, char* sCommande){
	/* Vérifie que le déplacement demandé par l'utilisateur est possible */
	if(strcmp(sCommande,"haut")==0){
		if(pMotte[ePosX-1][ePosY].eTaupes<2&&pMotte[ePosX-1][ePosY].eEtatterre!=Pierre) return 1;
	}
	else if (strcmp(sCommande,"bas")==0){
		if(pMotte[ePosX+1][ePosY].eTaupes<2&&pMotte[ePosX+1][ePosY].eEtatterre!=Pierre) return 1;
	}
	else if (strcmp(sCommande,"gauche")==0){
		if(pMotte[ePosX][ePosY-1].eTaupes<2&&pMotte[ePosX][ePosY-1].eEtatterre!=Pierre) return 1;
	}
	else if (strcmp(sCommande,"droite")==0){
		if(pMotte[ePosX][ePosY+1].eTaupes<2&&pMotte[ePosX][ePosY+1].eEtatterre!=Pierre) return 1;
	}
	else if(strcmp(sCommande,"vide")==0){
		return 1;
	}

	return 0;
}

void Rattaupes_deplacement(t_liste* pRattaupe, t_motte** pMotte, int ePosX, int ePosY, char* sCommande, SDL_Surface* ecran){
	/* S'occupe de déplacer le rattaupe en fonction de la demande de l'utilisateur */
	t_rattaupes Rattaupe;
	
	pMotte[ePosX][ePosY].eTaupes-=1;
	valeur_elt(pRattaupe,&Rattaupe);

	if(strcmp(sCommande,"haut")==0){
		ePosX-=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
		
	}
	else if (strcmp(sCommande,"bas")==0){
		ePosX+=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
	}
	else if (strcmp(sCommande,"gauche")==0){
		ePosY-=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
	}
	else if (strcmp(sCommande,"droite")==0){
		ePosY+=1;
		Rattaupe.ePosX=ePosX;
		Rattaupe.ePosY=ePosY;
	}
	else if (strcmp(sCommande,"vide")==0){
		Rattaupe.eSante+=10;
	}

	modif_elt(pRattaupe,Rattaupe);
	pMotte[ePosX][ePosY].eTaupes+=1;
	Rattaupes_absorption(pRattaupe, pMotte, ePosX, ePosY, ecran);
}

void Rattaupes_absorption(t_liste* pRattaupe, t_motte** pMotte, int ePosX, int ePosY, SDL_Surface* ecran){
	/* S'occupe de l'absorption des mottes de terre par les déplacements des rattaupes */
	if(pMotte[ePosX][ePosY].eEtatterre!=Pierre&&pMotte[ePosX][ePosY].eEtatterre!=Rien){
		switch (pMotte[ePosX][ePosY].eEtatterre){
			case Plein : 	pMotte[ePosX][ePosY].eEtatterre=Moyen;
					break;
			case Moyen :	pMotte[ePosX][ePosY].eEtatterre=Petit;
					break;
			case Petit : 	pMotte[ePosX][ePosY].eEtatterre=Rien;
					break;
			default:
					break;
		}
		Nourriture_absorption(pRattaupe, pMotte, ePosX, ePosY, ecran);
	}
}

void Nourriture_absorption (t_liste* pRattaupe, t_motte** pMotte, int ePosX, int ePosY, SDL_Surface* ecran){
	/* S'occupe de l'absorption de la nourriture lors des déplacements des rattaupes + supprime la nourriture ingérée et sante à 100% */
	t_rattaupes Rattaupe;
	char Nourrir[70] = "";
	SDL_Surface *SDL_Texte = NULL, *SDL_Clean = NULL;
	
	valeur_elt(pRattaupe,&Rattaupe);

	SDL_Rect_Blanc(ecran,SDL_Clean, 15, 190, LARGEUR_FENETRE-190, HAUTEUR_FENETRE+25);
	if(pMotte[ePosX][ePosY].Nourriture!=Vide){
		switch(pMotte[ePosX][ePosY].Nourriture){
			case Ver : sprintf(Nourrir, "          Votre taupe a mangé un ver"); Rattaupe.eSante+=40; break;
			case Plante : sprintf(Nourrir, "  Votre taupe a mangé une plante"); Rattaupe.eSante+=30; break;
			case Poison : sprintf(Nourrir, "  Votre taupe a mangé du poison"); Rattaupe.eSante-=20; break;
			case Vivifiant : sprintf(Nourrir, "  Votre taupe a mangé du vivifiant"); Rattaupe.eSante+=60; break;
			case Plante_seche : sprintf(Nourrir, "  Votre taupe a mangé une plante sèche"); Rattaupe.eSante+=10; break;
			case Non_comestible : sprintf(Nourrir, "  Votre taupe a mangé une plante avariée"); Rattaupe.eSante-=10; break;
			default : break;
		}

		/* eSante à 120 car décrémenté mais rattaupe vient de se nourrir donc il devient à 100% au début du tour */
		pMotte[ePosX][ePosY].Nourriture=Vide;
		pMotte[ePosX][ePosY].ptNourriture=0;
		modif_elt(pRattaupe,Rattaupe);
	}

	SDL_Ecrire(ecran, SDL_Texte, Nourrir, LARGEUR_FENETRE-205, HAUTEUR_FENETRE+25);
	SDL_Flip(ecran);

	SDL_FreeSurface(SDL_Texte);
	SDL_FreeSurface(SDL_Clean);

}

void Sante_decremente (t_liste* pRattaupe, int32_t eTour){
	/* Décrémente la santé du rattaupe de 20% à chaque tour sauf 33% si grossesse en cours */
	t_rattaupes Rattaupe;

	en_tete(pRattaupe);

	while(!hors_liste(pRattaupe)){
		valeur_elt(pRattaupe,&Rattaupe);
		if(Rattaupe.Age==Adulte){
			if(Rattaupe.eSante>0){
				if(Rattaupe.eGestation>0||(Rattaupe.eDelaiGrossesse<3&&eTour>=6&&Rattaupe.Sexe==Femelle)){
					if(Rattaupe.eSante==34)
						Rattaupe.eSante=0;
						if(Rattaupe.Race==Cuisinier)
							Rattaupe.eSante+=14;
					else
						Rattaupe.eSante-=33;
						if(Rattaupe.Race==Cuisinier)
							Rattaupe.eSante+=13;
				}
				else {
					Rattaupe.eSante-=20;
					if(Rattaupe.Race==Cuisinier)
						Rattaupe.eSante+=2;
				}
				modif_elt(pRattaupe,Rattaupe);
			}
		}
		suivant(pRattaupe);
	}
}

void Mort_Rattaupe (t_motte** pMotte, t_liste* pRattaupe, SDL_Surface* ecran, int32_t eNombreJoueurIncremente, int32_t eNombreJoueur, SOCKET* csock){
	/* Tue un rattaupe quand sa santé est à 0%, envoi au joueur concerné la position du rat-taupe mort */
	char Mort[60] = "";
	SDL_Surface *SDL_Texte = NULL, *SDL_Clean = NULL;
	t_rattaupes Rattaupe;	
	int eRattaupeMort = 0;
	int32_t eMortPosX, eMortPosY;
	int eCompteurinfos=1;
	char cMortInfo='x';
	
	en_queue(pRattaupe);

	while(!hors_liste(pRattaupe)){
		valeur_elt(pRattaupe,&Rattaupe);
		if(Rattaupe.eSante<=0){
			if(eNombreJoueurIncremente==0) 
				Vue_Mort(Rattaupe.ePosX,Rattaupe.ePosY, ecran);
			pMotte[Rattaupe.ePosX][Rattaupe.ePosY].eTaupes-=1;
			eRattaupeMort++;
			eMortPosX=htonl(Rattaupe.ePosX);
			eMortPosY=htonl(Rattaupe.ePosY);
			if(eNombreJoueurIncremente!=0){
				if(cMortInfo!='o'){
					cMortInfo='o';
					send(csock[eNombreJoueurIncremente], &cMortInfo, sizeof(cMortInfo), 0);
				}
				send(csock[eNombreJoueurIncremente], (char const*)&eMortPosX, sizeof(eMortPosX), 0);
				send(csock[eNombreJoueurIncremente], (char const*)&eMortPosY, sizeof(eMortPosY), 0);
			}
			oter_elt(pRattaupe);
		}
		else precedent(pRattaupe);
	}

	if(eNombreJoueurIncremente!=0&&eRattaupeMort!=0){
		eMortPosX=htonl(999);
		send(csock[eNombreJoueurIncremente], (char const*)&eMortPosX, sizeof(eMortPosX), 0);
		send(csock[eNombreJoueurIncremente], (char const*)&eMortPosX, sizeof(eMortPosX), 0);
	}

	for(eCompteurinfos=1;eCompteurinfos<eNombreJoueur;eCompteurinfos++){
		cMortInfo='n';
		if(eNombreJoueurIncremente==eCompteurinfos&&eRattaupeMort!=0){}
		else send(csock[eCompteurinfos], &cMortInfo, sizeof(cMortInfo), 0);
	}

	if(eNombreJoueurIncremente==0){
		if(eRattaupeMort==1)
		   sprintf(Mort, "%i de vos rattaupes est mort !", eRattaupeMort);
		if(eRattaupeMort>1)
		   sprintf(Mort, "%i de vos rattaupes sont morts !", eRattaupeMort);

		if(eRattaupeMort>0)	{
			SDL_Rect_Blanc(ecran,SDL_Clean, ESPACE_MENU-35, LARGEUR_FENETRE, 0, HAUTEUR_FENETRE+35); /* Vidage quasi entier du menu */
			SDL_Rect_Blanc(ecran,SDL_Clean, ESPACE_MENU, 190, LARGEUR_FENETRE-190, HAUTEUR_FENETRE);
			SDL_Flip(ecran);
			SDL_Ecrire(ecran, SDL_Texte, Mort, 5, HAUTEUR_FENETRE+35);
			SDL_Flip(ecran);
			sleep(2);
		}
	}

	Vue_afficher(pMotte,ecran);

	SDL_FreeSurface(SDL_Texte);
	SDL_FreeSurface(SDL_Clean);

}

void Nourriture_decremente(t_motte** pMotte){
	/* Décremente l'état de la nourriture à chaque tour */
	int eLigne, eColonne;
	for(eLigne=1;eLigne<elmax-1;eLigne++){
		for(eColonne=1;eColonne<ecmax-1;eColonne++){
			switch(pMotte[eLigne][eColonne].ptNourriture){
				case 40 : pMotte[eLigne][eColonne].ptNourriture-=40;
				case 70 : pMotte[eLigne][eColonne].ptNourriture-=30;
				case 100 : pMotte[eLigne][eColonne].ptNourriture-=30;

			}
			if(pMotte[eLigne][eColonne].ptNourriture==0)
				pMotte[eLigne][eColonne].Nourriture=Vide;
		}
	}
}

void Enceinte_incremente (t_liste* pRattaupe, int32_t eTour){
	/* Incrémente le delai de grossesse à chaque tour et diminue celui de gestation */
	t_rattaupes Rattaupe;

	en_tete(pRattaupe);
	if(eTour!=0){ /* Pas d'incrémentation à l'initialisation */
		while(!hors_liste(pRattaupe)){
			valeur_elt(pRattaupe,&Rattaupe);
			/* Si le sexe est Male et Age est Adulte et DelaiGrossesse <6 */
			if(Rattaupe.Sexe==Femelle&&Rattaupe.Age==Adulte&&Rattaupe.eDelaiGrossesse<6){
				Rattaupe.eDelaiGrossesse++;
				modif_elt(pRattaupe,Rattaupe);
			}
			if(Rattaupe.Sexe==Femelle&&Rattaupe.Age==Adulte&&Rattaupe.eGestation>0){
				Rattaupe.eGestation--;
				modif_elt(pRattaupe,Rattaupe);
			}
			suivant(pRattaupe);
		}
	}
}

void Rattaupe_Grandis(t_liste* pRattaupe){
	/* Fait grandir un bébé s'il a plus de 3 tours sinon augmente sa gestation */
	t_rattaupes Rattaupe;

	en_tete(pRattaupe);
	while(!hors_liste(pRattaupe)){
		valeur_elt(pRattaupe,&Rattaupe);
		if(Rattaupe.Age==Jeune){
			if(Rattaupe.eGestation==3){
				Rattaupe.Age=Adulte;
				Rattaupe.eGestation=0;
				Rattaupe.eDelaiGrossesse=0;
				modif_elt(pRattaupe,Rattaupe);
			}
			else{
				Rattaupe.eGestation+=1;
				modif_elt(pRattaupe,Rattaupe);
			}
		}
		suivant(pRattaupe);
	}
}
